import getUserTempId from "@/utils/userTempId"
import {
  SET_USERTOKEN_STATE,
  SET_USERINFO_STATE,
  RESET_USER_STATE,
} from "../module_type"
import { reqLogin, reqUserInfo, reqLogout } from "@/api"
import { getToken, setToken, reomveToken } from "@/utils/token"
const state = {
  userTempId: getUserTempId(),
  token: getToken() || "",
  userInfo: {},
}
const mutations = {
  //1. 修改vuex数据token的值
  [SET_USERTOKEN_STATE](state, payload) {
    state.token = payload.token
    setToken(payload.token) //持久化存储token
  },
  //2.修改vuex数据userInfo的值
  [SET_USERINFO_STATE](state, payload) {
    state.userInfo = payload.userInfo
  },
  //3.重置token和user数据
  [RESET_USER_STATE](state) {
    state.token = "" //清除token
    state.userInfo = {} //清除用户信息
    reomveToken() //清除持久化存储的token
  },
}
const actions = {
  //1.登录请求获取token
  async getLogin({ commit }, userInfo) {
    try {
      const res = await reqLogin(userInfo)
      commit(SET_USERTOKEN_STATE, res)
    } catch (error) {
      alert(error.message)
      return Promise.reject() //这样就算是异常了,可以让调用函数的地方得到一个失败的Promise进行异常处理
    }
  },
  //2.请求用户信息
  async getUserInfo({ commit }) {
    try {
      const res = await reqUserInfo()
      commit(SET_USERINFO_STATE, { userInfo: res })
    } catch (error) {
      alert(error.message)
      return Promise.reject(error) //因为当前函数已经使用try处理异常了,所以在调用函数的地方无法得知异常存在（就会导致调用函数的位置一直得到成功的Promise）,所以需要我们在catch的位置进行抛出失败的promise,则当前函在失败的情况下就会返回失败的promise
    }
  },
  //3.退出登录请求
  async getLogout({ commit }) {
    try {
      await reqLogout()
      alert("退出登录成功")
      //清理数据
      commit(RESET_USER_STATE)
    } catch (error) {
      alert(error.message)
    }
  },
  //4.清理用户所有token和信息方法，包括过期的token或者被修改过的token
  resetToken({ commit }) {
    commit(RESET_USER_STATE)
  },
}
export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
